﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaBastanteo.Persistencia;
using SistemaBastanteo.Dominio;
using NUnit.Framework;

namespace SistemaBastanteo.Pruebas
{
    public class Test07_VerificarPoderes
    {
        IBastanteoDAO bastanteoDAO= null;
        IClienteDAO clienteDAO = null;
        IRepresentanteDAO representanteDAO = null;
        ITipoEmpresaDAO tipoEmpresaDAO = null;
        ITipoDocumentoDAO tipoDocumentoDAO = null;
        IPoderDAO poderDAO = null;

        TipoEmpresa tipoEmpresaCreado = null;
        Cliente clienteCreado = null;
        Representante representanteCreadoA = null;
        Representante representanteCreadoB = null;
        TipoDocumento tipoDocumentoCreado = null;
        Poder poderCreado1 = null;
        Poder poderCreado2 = null;
        Bastanteo bastanteoSF = null;
        Bastanteo bastanteoEC = null;
        


        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            tipoEmpresaDAO = new Persistencia.NH.TipoEmpresaDAO(); 
            clienteDAO = new Persistencia.NH.ClienteDAO(); 
            tipoDocumentoDAO = new Persistencia.NH.TipoDocumentoDAO();
            representanteDAO = new Persistencia.NH.RepresentanteDAO();
            poderDAO = new Persistencia.NH.PoderDAO();
            
            bastanteoDAO = new Persistencia.ADO.BastanteoDAO();

            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
            {
                bastanteoDAO.Eliminar(bastanteo);
            }

            foreach (Representante representate in representanteDAO.ListarTodos())
                representanteDAO.Eliminar(representate);

            foreach (TipoDocumento tipoDocumento in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipoDocumento);

            foreach (Cliente cliente in clienteDAO.ListarTodos())
                clienteDAO.Eliminar(cliente);

            foreach (TipoEmpresa tipoEmpresa in tipoEmpresaDAO.ListarTodos())
                tipoEmpresaDAO.Eliminar(tipoEmpresa);

            foreach (Poder poder in poderDAO.ListarTodos())
                poderDAO.Eliminar(poder);

            tipoEmpresaCreado = tipoEmpresaDAO.Crear(new TipoEmpresa() 
            { 
                Abreviacion = "SAC" 
            });
            
            clienteCreado = clienteDAO.Crear(new Cliente() 
            {   
                Ruc="11020304052", 
                RazonSocial="Seguridad Rimac", 
                Inicio=new DateTime(2001,10,10), 
                Tipo=tipoEmpresaDAO.Obtener(tipoEmpresaCreado.Codigo), 
                Empleados=15 
            });

            tipoDocumentoCreado = tipoDocumentoDAO.Crear(new TipoDocumento() 
            { 
                Descripcion = "DNI" 
            });

            representanteCreadoA = representanteDAO.Crear(new Representante()
            {
                TipoDocumento = tipoDocumentoDAO.Obtener(tipoDocumentoCreado.Codigo),
                Documento = "41404714",
                Nombres = "Jenny Rosario",
                Apellidos = "Ponce Bravo",
                Cargo = "Supervisora", 
                Grupo = "A", 
                Cliente= clienteDAO.Obtener(clienteCreado.Codigo )
            });
            
            representanteCreadoB = representanteDAO.Crear(new Representante()
            {
                TipoDocumento = tipoDocumentoDAO.Obtener(tipoDocumentoCreado.Codigo),
                Documento = "07080772",
                Nombres = "Roller",
                Apellidos = "Bravo Gonzalez",
                Cargo = "Gerente",
                Grupo = "B",
                Cliente = clienteDAO.Obtener(clienteCreado.Codigo)
            });


            poderCreado1 = poderDAO.Crear(new Poder() 
            {
                CodigoCorto = "CHCO", 
                Descripcion="Cobro de cheque", 
                TipoProducto="Activo"
            });

            poderCreado2 = poderDAO.Crear(new Poder()
            {
                CodigoCorto = "EFRET",
                Descripcion = "Retiro de efectivo",
                TipoProducto = "Activo"
            });


            bastanteoSF = bastanteoDAO.Generar( 
                new Bastanteo()
                { 
                    Cliente = clienteCreado, 
                    Grupo   = representanteCreadoA.Grupo, 
                    Poder   = poderCreado1,
                    Importe = 6500, 
                    FechaLimite = new DateTime(2011,11, 25), 
                    TipoIntervencion="A Sola Firma"
                },
                new List<Combinacion>(){});

            bastanteoEC = new Bastanteo()
            {
                Cliente = clienteCreado,
                Grupo = representanteCreadoB.Grupo,
                Poder = poderCreado2,
                Importe = 4500,
                FechaLimite = new DateTime(2011, 11, 30),
                TipoIntervencion = "En Conjunto"
            };
                
            bastanteoEC = bastanteoDAO.Generar( bastanteoEC, 
            new List<Combinacion>() 
            {
                new Combinacion()
                { 
                        Cliente=bastanteoEC.Cliente , 
                        Grupo = bastanteoEC, 
                        Poder = bastanteoEC.Poder, 
                        GrupoConjunto = representanteCreadoA.Grupo
                }
            });
            
        }

        [Test]
        public void Test1_VerificaPoderes()
        {

            //Ingresando los valores
            String Ruc = clienteCreado.Ruc;
            int codigoRep = representanteCreadoA.Codigo;
            int codigoPoder = poderCreado1.Codigo;
            decimal importe = 7000;

            Bastanteo verPoderBastanteo = bastanteoDAO.VerificarPoderes(Ruc, codigoRep, codigoPoder);

            //Valida si no es null la Lista de Poderes, tiene poder
            Assert.IsNotNull(verPoderBastanteo);

            //Error Si Poder Ya Venció
            DateTime fechaActual = new DateTime(2011, 11, 30);
            Assert.Catch<Exception>(delegate
            {
                Assert.LessOrEqual(fechaActual, verPoderBastanteo.FechaLimite);
            });

            //Error no tiene poder para realizar la operaciòn indicada.
            int poderAComparar = poderCreado2.Codigo;
            Assert.Catch<Exception>(delegate
           {
               Assert.AreEqual(poderAComparar, verPoderBastanteo.Poder.Codigo);
           });
            //Valida si Importe es Superior

            //Error Si Monto es mayor a monto Permitido
            Assert.Catch<Exception>(delegate
            {
                Assert.LessOrEqual(importe, verPoderBastanteo.Importe);
            });

        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
            {
                bastanteoDAO.Eliminar(bastanteo);
            }

            foreach (Representante representate in representanteDAO.ListarTodos())
                representanteDAO.Eliminar(representate);

            foreach (TipoDocumento tipoDocumento in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipoDocumento);

            foreach (Cliente cliente in clienteDAO.ListarTodos())
                clienteDAO.Eliminar(cliente);

            foreach (TipoEmpresa tipoEmpresa in tipoEmpresaDAO.ListarTodos())
                tipoEmpresaDAO.Eliminar(tipoEmpresa);

            foreach (Poder poder in poderDAO.ListarTodos())
                poderDAO.Eliminar(poder);
            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
        
    
    }
}